/*
 * Pool.h
 *
 *  Created on: 2011/07/26
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_POOL_H
#define INCLUDED_NTENGINE_POOL_H

namespace NTEngine {

/**
 * @brief バッファプール
 */
template< class T > class Pool {
public:
	explicit Pool( int defaultBlockSize = 16 );
	~Pool();

	/**
	 * 標準ブロック数を変更
	 */
	void setDefaultBlockSize( int blockSize );

	/**
	 * 全開放
	 */
	void clear();

	/**
	 * n個確保
	 */
	T* allocate( int n = 1 );

	/**
	 * n個コピーコンストラクト
	 */
	T* allocate( const T*, int n = 1 );

private:
	struct Block {
		Block* mNext;
		T* mElements;
		int mUsedNumber;
		int mSize;
	};
	void operator=( const Pool& );
	Pool( const Pool& );

	int mDefaultBlockSize;
	Block mHead;
	Block* mLastBlock;
};

} // namespace NTEngine
#include "NTEngine/Base/Impl/PoolImpl.h" //中身はこの中

#endif // INCLUDED_NTENGINE_POOL_H
